#include <iostream>
#include <unistd.h>
// #include <pthread.h>
#include "Thread.hpp"
#include "lockGuard.hpp"

using namespace std;

int tickets = 1000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 全局锁，不需要 init 和 destroy

void threadRoutine(void *args)
{
    string message = static_cast<const char *>(args);

    while (true)
    {
        // pthread_mutex_lock(&mutex);
        {
            Guard g1(&mutex);
            if (tickets > 0)
            {
                usleep(2000); // 抢票中
                cout << "线程 " << message << " 已抢到票：" << tickets-- << endl;
                // pthread_mutex_unlock(&mutex);
            }
            else
            {
                // pthread_mutex_unlock(&mutex);
                break;
            }
        }

        usleep(100); // 抢到票后还要执行相关动作
    }
}

int main()
{
    int n = 3;
    Thread arr[n];
    for (int i = 0; i < n; i++)
    {
        char buff[64];
        snprintf(buff, 64, "thread<--->%d", i);
        arr[i] = {i, threadRoutine, (void *)buff}; // 线程创建
        cout << "线程名字：" << arr[i].getName() << "，线程ID: " << arr[i].getID() << "，线程状态: " << arr[i].getStatus() << endl;
        arr[i].run();
        arr[i].detach(); // 线程分离
        usleep(1000);
    }

    while (tickets)
        ;

    usleep(1000);
    cout << "所有的票已被线程抢完" << endl;

    return 0;
}

// void threadRun(void *arg)
// {
//     string message = static_cast<const char *>(arg);

//     int cnt = 5;
//     while (cnt--)
//     {
//         cout << "我是一个线程，我传递的信息是 " << message << " 我正在运行" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     int n = 3;
//     Thread arr[n];
//     for(int i = 0; i < n; i++)
//     {
//         arr[i] = { i, threadRun, (void*)"zz668mm" };    //构造 + 赋值重载
//         cout << "线程名字：" << arr[i].getName() << "，线程ID: " << arr[i].getID() << "，线程状态: " << arr[i].getStatus() << endl;
//         arr[i].run();
//         cout << "线程名字：" << arr[i].getName() << "，线程ID: " << arr[i].getID() << "，线程状态: " << arr[i].getStatus() << endl;
//     }

//     for(int i = 0; i < n; i++)
//     {
//         arr[i].join();
//         cout << "线程名字：" << arr[i].getName() << "，线程ID: " << arr[i].getID() << "，线程状态: " << arr[i].getStatus() << endl;
//     }

//     return 0;
// }

// int tickets = 1000; //票数
// //pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;   //全局锁，不需要 init 和 destroy

// //线程信息类
// class TData
// {
// public:
//     TData(const char* name, pthread_mutex_t* pmutex)
//         :_name(name)
//         ,_pmutex(pmutex)
//     {}

//     ~TData()
//     {}

// public:
//     string _name;   //线程名
//     pthread_mutex_t* _pmutex; //锁
// };

// void *threadRoutine(void *args)
// {
//     // string name = static_cast<const char*>(args);
//     TData* pt = static_cast<TData*>(args);  //获取对应的对象指针

//     while(true)
//     {
//         // pthread_mutex_lock(&mutex);
//         pthread_mutex_lock(pt->_pmutex);
//         if(tickets > 0)
//         {
//             usleep(2000);   //抢票中
//             cout << "线程 " << pt->_name << " 已抢到票：" << tickets-- << endl;
//             pthread_mutex_unlock(pt->_pmutex);
//         }
//         else
//         {
//             // pthread_mutex_unlock(&mutex);
//             pthread_mutex_unlock(pt->_pmutex);
//             break;
//         }

//         usleep(100);   //抢到票后还要执行相关动作
//     }

//     pthread_exit(nullptr);  //线程退出
// }

// int main()
// {
//     int n = 3;
//     pthread_t arr[n];
//     pthread_mutex_t mutex;  //局部锁
//     pthread_mutex_init(&mutex, nullptr);

//     for(int i = 0; i < n; i++)
//     {
//         // char* buff = new char[64];
//         char buff[64];
//         snprintf(buff, 64, "thread-%d", i);
//         TData* td = new TData(buff, &mutex);
//         pthread_create(arr + i, nullptr, threadRoutine, td);
//         pthread_detach(arr[i]); //创建后，就分离，不必再等待
//         usleep(1000);
//     }

//     while(tickets);

//     usleep(1000);
//     cout << "所有的票已被线程抢完" << endl;

//     pthread_mutex_destroy(&mutex);

//     return 0;
// }